from django.shortcuts import render
from django.views.generic import  View
from django.http import HttpResponse
from  django.db.models import Q


from .models import CourseOrg,CityDict,Teacher
from .forms import UserAskForm
from operation.models import UserFavorite
from  courses.models import Course


from pure_pagination import Paginator,EmptyPage,PageNotAnInteger
# Create your views here.

class OrgView(View):
    def get(self,request):
        all_orgs=CourseOrg.objects.all()
        #-是倒序排列，取前5个
        hot_orgs=all_orgs.order_by("-click_nums")[:5]
        all_citys=CityDict.objects.all()

        #全局搜索机构
        search_keywords = request.GET.get("keywords", "")
        if search_keywords:
            all_orgs = all_orgs.filter(Q(name__icontains=search_keywords) | Q(desc__contains=search_keywords) )

        #取出筛选的城市
        city_id=request.GET.get('city',"")
        if city_id:
            all_orgs=all_orgs.filter(city_id=int(city_id))

        # 取出机构类别
        category = request.GET.get('ct', "")
        if category:
            all_orgs=all_orgs.filter(category=category)

        #学习人数和课程数排序
        sort=request.GET.get('sort',"")
        if sort:
                if sort=="students":
                    all_orgs=all_orgs.order_by("-students")
                else:
                    all_orgs=all_orgs.order_by("-course_nums")

        org_nums = all_orgs.count()

        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        p = Paginator(all_orgs, 5, request=request)
        # 这里的数字5是每页显示的记录条数，官方例子没加这个参数，但是不加会报错。
        orgs = p.page(page)
        return render(request, "org-list.html", {
            "all_orgs": orgs,
            "all_citys": all_citys,
            "org_nums": org_nums,
            "city_id":city_id,
            "category":category,
            "hot_orgs":hot_orgs,
            "sort":sort
        })

class AddUserAskView(View):
    """
    用户添加咨询
    """
    def post(self,request):
        userask_form=UserAskForm(request.POST)
        if userask_form.is_valid():
            user_ask=userask_form.save(commit=True)
            return HttpResponse('{"status":"success"}', content_type='application/json')
        else:
            return HttpResponse('{"status":"fail", "msg":"添加出错"}', content_type='application/json')


class OrgHomeView(View):
    """
    机构首页
    """
    def get(self,request,org_id):
        current_page='home'
        course_org=CourseOrg.objects.get(id=int(org_id))
        has_fav = False
        if request.user.is_authenticated:
            if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
                has_fav = True
        all_courses=course_org.course_set.all()[:3]
        all_teachers=course_org.teacher_set.all()
        return render(request,'org-detail-homepage.html',{
            "all_courses":all_courses,
            "all_teachers":all_teachers,
            "course_org":course_org,
            "current_page":current_page,
            "has_fav":has_fav
        })


class OrgCourseView(View):
    """
    机构课程
    """
    def get(self,request,org_id):
        current_page='course'
        course_org=CourseOrg.objects.get(id=int(org_id))
        has_fav = False
        if request.user.is_authenticated:
            if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
                has_fav = True

        all_courses=course_org.course_set.all()
        return render(request,'org-detail-course.html',{
            "all_courses": all_courses,
            "course_org": course_org,
            "current_page":current_page,
            "has_fav":has_fav
        })


class OrgDesciew(View):
    """
    机构介绍
    """
    def get(self,request,org_id):
            current_page="desc"
            course_org=CourseOrg.objects.get(id=int(org_id))
            has_fav = False
            if request.user.is_authenticated:
                if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
                    has_fav = True
            return render(request,'org-detail-desc.html',{
                "current_page": current_page,
                "course_org": course_org,
                "has_fav":has_fav
            })


class OrgTeachersView(View):
    """
    机构教师
    """
    def get(self,request,org_id):
        current_page='teachers'
        course_org=CourseOrg.objects.get(id=int(org_id))
        has_fav = False
        if request.user.is_authenticated:
            if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
                has_fav = True
        all_teachers=course_org.teacher_set.all()
        return render(request,'org-detail-teachers.html',{
            "all_teachers":all_teachers,
            "course_org":course_org,
            "current_page":current_page,
            "has_fav":has_fav
        })


class AddFavView(View):
    # 用户收藏，和取消收藏
    def post(self, request):
        fav_id = request.POST.get('fav_id', 0)
        fav_type = request.POST.get('fav_type', 0)

        if not request.user.is_authenticated:
            # 判断用户登录状态
            return HttpResponse('{"status":"fail", "msg":"用户未登录"}', content_type='application/json')

        # 使用用户、收藏id、收藏类型进行联合查询
        exist_records = UserFavorite.objects.filter(user=request.user, fav_id=int(fav_id), fav_type=int(fav_type))
        if exist_records:
            # 记录已存在 表示用户取消收藏
            exist_records.delete()
            if int(fav_type) == 1:
                course = Course.objects.get(id=int(fav_id))
                course.fav_nums -= 1
                if course.fav_nums < 0:
                    course.fav_nums = 0
                course.save()
            elif int(fav_type) == 2:
                course_org = CourseOrg.objects.get(id=int(fav_id))
                course_org.fav_nums -= 1
                if course_org.fav_nums < 0:
                    course_org.fav_nums = 0
                course_org.save()
            elif int(fav_type) == 3:
                teacher = Teacher.objects.get(id=int(fav_id))
                teacher.fav_nums -= 1
                if teacher.fav_nums < 0:
                    teacher.fav_nums = 0
                teacher.save()

            return HttpResponse('{"status":"success", "msg":"收藏"}', content_type='application/json')

        else:
            # 记录不存在 表示用户未收藏，并进行收藏
            user_fav = UserFavorite()
            if int(fav_id) > 0 and int(fav_type) > 0:
                user_fav.user = request.user
                user_fav.fav_id = int(fav_id)
                user_fav.fav_type = int(fav_type)
                user_fav.save()

                if int(fav_type) == 1:
                    course = Course.objects.get(id=int(fav_id))
                    course.fav_nums += 1
                    course.save()
                elif int(fav_type) == 2:
                    course_org = CourseOrg.objects.get(id=int(fav_id))
                    course_org.fav_nums += 1
                    course_org.save()
                elif int(fav_type) == 3:
                    teacher = Teacher.objects.get(id=int(fav_id))
                    teacher.fav_nums += 1
                    teacher.save()

                return HttpResponse('{"status":"success", "msg":"已收藏"}', content_type='application/json')
            else:
                return HttpResponse('{"status":"fail", "msg":"收藏出错"}', content_type='application/json')


class TeacherListView(View):
    def get(self,request):
        all_teachers=Teacher.objects.all()
        teacher_nums = all_teachers.count()

        # 全局搜索讲师
        search_keywords = request.GET.get("keywords", "")
        if search_keywords:
            all_teachers = all_teachers.filter(Q(name__icontains=search_keywords) |
                                               Q(work_company__contains=search_keywords)|
                                               Q(work_position__contains=search_keywords))

        #讲师人气
        sort=request.GET.get('sort',"")
        if sort:
            if sort=='hot':
                all_teachers=all_teachers.order_by('-click_nums')


        #讲师排行榜
        sorted_teacher=Teacher.objects.all().order_by('-click_nums')[:5]

        #对讲师分页
        try:
            page=request.GET.get('page',1)
        except PageNotAnInteger:
            page=1

        p=Paginator(all_teachers,2,request=request)
        teachers=p.page(page)
        return  render(request,"teachers-list.html",{
            "all_teachers":teachers,
            "teacher_nums":teacher_nums,
            "sorted_teacher":sorted_teacher,
            "sort":sort
        })


class TeacherDetailView(View):
    def get(self,request,teacher_id):
        teacher=Teacher.objects.get(id=int(teacher_id))
        all_courses=Course.objects.filter(teacher=teacher)

        has_teacher_faved=False
        has_org_faved=False
        if UserFavorite.objects.filter(user=request.user,fav_type=3,fav_id=teacher.id):
            has_teacher_faved=True

        if UserFavorite.objects.filter(user=request.user,fav_type=2,fav_id=teacher.org.id):
            has_org_faved=True

        # 讲师排行榜
        sorted_teacher = Teacher.objects.all().order_by('-click_nums')[:5]
        return render(request,"teacher-detail.html",{
            "teacher":teacher,
            "all_courses":all_courses,
            "sorted_teacher":sorted_teacher,
            "has_teacher_faved":has_teacher_faved,
            "has_org_faved":has_org_faved
        })
